package com.duobaoyu.dby.supply.common.biz.bo.order;

import cn.hutool.core.collection.CollUtil;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 * 渠道订单明细出参
 * @author chenms
 * @date 2023/10/11 5:54 PM
 */
@Data
public class ChannelOrderDetailOutBO implements Serializable {
    /**
     * 供应链子单号
     */
    private String orderSn;
    /**
     * 供应链三方交易单号
     */
    private String orderTradeSn;
    /**
     * 渠道交易订单号
     */
    private String channelTradeOrderSn;
    /**
     * 渠道总运费
     */
    private BigDecimal channelFreightAmount;

    /**
     * 渠道订单金额(商品总价,不含运费)
     */
    private BigDecimal channelOrderAmount;

    /**
     * 供应链子订单状态
     */
    private Integer status;


    /**
     * 实物订单明细集合
     */
    private List<RealOrderDetail> realOrderDetailList;

    /**
     * 虚拟订单明细集合
     */
    private List<VirtualOrderDetail> virtualOrderDetailList;


    /**
     * 实物订单明细
     */
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    @Data
    public static class RealOrderDetail {
        /**
         * 供应链订单明细状态
         */
        private Integer status;

        /**
         * 渠道子单运费
         */
        private BigDecimal channelFreightAmount;

        /**
         * 渠道子订单号或物流(运单)单号
         */
        private String channelOrderSn;

        /**
         * 渠道父订单号
         */
        private String channelOrderParentSn;

        /**
         * 父子单类型(京东渠道有值)
         */
        private Integer parentType;

        /**
         * 商品信息列表
         */
        private List<RealOrderSkuInfo> skuInfos;


        /**
         * 实物订单商品明细
         */
        @AllArgsConstructor
        @NoArgsConstructor
        @Builder
        @Data
        public static class RealOrderSkuInfo {
            /**
             * 商品名称
             */
            private String skuName;

            /**
             * 渠道sku编号
             */
            private String channelSkuCode;

            /**
             * 渠道商品编码
             */
            private String channelProductCode;

            /**
             * 购买数量
             */
            private Integer skuNum;

            /**
             * 渠道sku单价
             */
            private BigDecimal channelSkuUnitPrice;

            /**
             * 商品税率
             */
            private BigDecimal skuTaxRate;

            /**
             * 商品实付总金额(不含运费)
             */
            private BigDecimal paymentAmount;

            /**
             * 订单类型
             * 京东: 0普通、1附件、2赠品、3延保
             * 壹钱包: 001开头的代表实物商品，002开头的代表着虚拟商品
             * 得力: (0,1,2,3)对应含义(普通，附件，赠品，服务)，不传默认为0
             */
            private String type;

            /**
             * 渠道sku分摊运费
             */
            private BigDecimal channelSkuSplitFreight;

            /**
             * 退款商品数量(平安渠道)
             */
            private Integer channelReturnSkuNum;

            /**
             * 退运费金额(平安渠道)
             */
            private BigDecimal channelReturnFreightAmount;

            /**
             * 是否存在订单商品同步数据
             */
            public boolean existsOrderProductSyncData() {
                return Objects.nonNull(this.channelReturnSkuNum) ||
                        Objects.nonNull(this.channelReturnFreightAmount) ||
                        Objects.nonNull(this.paymentAmount);
            }

        }

    }

    /**
     * 虚拟订单信息
     */
    @Data
    public static class VirtualOrderDetail {

        /**
         * 供应链订单明细状态
         */
        private Integer status;
        /**
         * 是否需要修改详情单信息
         */
        private Boolean isEditDetail;
        /**
         * 渠道子订单号或物流(运单)单号
         */
        private String channelOrderSn;
        /**
         * 渠道商品编号
         */
        private String channelSkuCode;
        /**
         * 渠道订单金额总金额(单位：元)
         */
        private BigDecimal channelOrderAmount;
        /**
         * 充值数量（加油卡，视频业务默认为1，其它业务按照实际情况传递）
         */
        private Integer num;
        /**
         * 卡券生成时间
         */
        private LocalDateTime createTime;
        /**
         * 订单完成时间
         */
        private LocalDateTime completeTime;
        /**
         * 充值号码
         */
        private String rechargeNumber;

        /**
         * 充值金额
         */
        private BigDecimal rechargeAmount;

        /**
         * 实际到账
         */
        private BigDecimal actualAmount;

        /**
         * 渠道退款金额
         */
        private BigDecimal channelReturnAmount;


        /**
         * 卡券信息
         */
        private List<Card> cardList;

        /**
         * 是否存在订单商品同步数据
         */
        public boolean existsOrderProductSyncData() {
            return Objects.nonNull(actualAmount) || Objects.nonNull(channelOrderAmount)  || CollUtil.isNotEmpty(cardList);
        }

        @Builder
        @Data
        @NoArgsConstructor
        @AllArgsConstructor
        public static class Card {
            /**
             * 卡类型
             */
            private Integer cardType;
            /**
             * 卡号
             */
            private String cardNumber;
            /**
             * 密码
             */
            private String cardPwd;
            /**
             * 卡密有效期
             */
            private Long cardDeadline;
            /**
             * 卡券唯一码（卡密无此参数）
             */
            private String uniqueCode;
            /**
             * 卡券URL地址
             */
            private String linkUrl;

            /**
             * 单价
             */
            private BigDecimal price;
        }
    }
}
